#pragma once
#include "../RefCountedObject.h"
#include "SevenZipInterfaces.h"
#include "Factory.h"
#include "SevenZipArchiveItem.h"

namespace SevenZip
{

struct CSevenZipArchive : CRefCountedObject<CSevenZipArchive>
{
	CSevenZipArchive();
	~CSevenZipArchive();

	STDMETHODIMP InitializeFromPath(const CSevenZipFactoryPtr &, __in LPCWSTR);
	STDMETHODIMP InitializeFromPIDL(const CSevenZipFactoryPtr &, __in PCIDLIST_ABSOLUTE);
	STDMETHODIMP InitializeFromStream(const CSevenZipFactoryPtr &, const CStringW &, const CComPtrBase<IStream> &);

	STDMETHODIMP Extract();

	CSevenZipArchiveItem * GetRoot()
	{
		return _RootFolder;
	}

private:

	STDMETHODIMP Open(const CSevenZipFactoryPtr&);
	STDMETHODIMP GetItems();

	CStringW _Name;

	CComPtr<IInStream>  _InStream;
	CComPtr<IInArchive> _InArchive;

	CSevenZipArchiveItem * _RootFolder;
};

typedef CComPtr<CSevenZipArchive> CSevenZipArchivePtr;

}